package zuoye7;

import java.io.*;
import java.net.Socket;

public class TalkClient2 {
    public static void main(String args[]) {
        try{
            //向本机的4700端口发出客户请求
            Socket socket=new Socket("127.0.0.1",4700);
            //System.out.println(socket);//输出本客户端的编号，方便观察，可删除
            BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));//键盘输入流
            DataOutputStream os=new DataOutputStream(socket.getOutputStream());//消息，文件输出流
            DataInputStream is=new DataInputStream(socket.getInputStream());//消息，文件输入流
            String readline;
            System.out.println("如果：.和文件分隔符一起发送，则认为你在发文件，如果发送文件请别发送空文件");
            System.out.println("会发生异常，聊天请随意发送文字，如果想获取文件，公屏上会有文件名称，请自行下载");
            while(true){
                if(sin.ready())//DataOutputStream特有的方法，在不读取的情况下，查看缓冲区是否有可读取的内容
                {//如果键盘有输入，即先发消息
                    readline=sin.readLine();
                    os.writeUTF(readline);
                    os.flush();//刷新输出流，使Server马上收到该字符串
                    //这里就是用文字或者文件来进行分割了，如果有.说明是文件，如果不是，说明是文字
                    String[] talk=readline.split("\\:");

                    //talk[1]是整个文件名
                    if(readline.contains(":")&&readline.contains(".")&&readline.contains(File.separator))//如果要发送文件
                    {
                        //这里直接输入的就是就是文件了
                        //C:\Program Files\Java\jdk-11.0.7\bin\java.exe类似于这种格式，上传的时候不用进行
                        File f = new File(readline);
                        FileInputStream fis = new FileInputStream(f);//读文件对象，该文件就在根目录下
                        int m,len;
                        long l=f.length(); //获取文件长度，单位kb
                        if((l%512)!=0) len = m = 512;
                        else len = m = 511;//防止文件正好是512字节的倍数
                        byte[] buffer = new byte[m];//读取输入流 ，一次读取512字节
                        //while ((len=fis.read(buffer,0,m))!=-1) {
                        while (len>=m) {//这while不能用上面注释的那个，read会阻塞
                            len=fis.read(buffer,0,m);
                            os.write(buffer,0,len);
                            os.flush();
                        }
                        fis.close();
                        System.out.println("文件读取发送成功！");
                    }
                    else
                    if(readline.equals("bye"))//若从标准输入读入的字符串为 "bye"则停止循环
                    {
                        break;
                    }
                }
                if(is.available()>0)//如果先收消息，也是先available()查看输入流的长度（未读取的情况下）
                {
                    //这里获取的就不用直接就是文字或者文件了，以.号进行分割
                    String get=is.readUTF();
                    System.out.println(get);
                    String[] wj1=get.split("\\.");//根据：进行分割
                    //如果文件的长度大于1，说明.进行分割，说明有文件
                    if(wj1.length>1)
                    {
                        //这边是要放入的文件地址位置
                        String[] arr = get.split("\\.");
                        String name = "E:\\"+(int)(Math.random()*1000)+"."+get.split("\\.")[arr.length-1];
                        File file = new File(name);
                        if(!file.exists()){
                            file.createNewFile();
                            //System.out.println("文件已新建！");
                        }

                        FileOutputStream fos = new FileOutputStream(name);//文件写入对象
                        //System.out.println(name);
                        int n=512,len=512;
                        byte[] data = new byte[n];//一次读取字节,一般不会太大
                        while(len>=n)//判断是否有可以读取的数据
                        {
                            len=is.read(data,0,n);
                            //一定要用DataInputStream，他有方法可以判断缓冲区是否有内容，这样就不会在没有内容时用read()阻塞了
                            fos.write(data,0,len);
                            fos.flush();
                            //System.out.println(len);
                        }
                        System.out.println("文件已下载成功!");
                        os.writeUTF("文件名称为：" + name);
                        fos.close();
                    }
                }
            } //继续循环
            os.close(); //关闭Socket输出流
            is.close(); //关闭Socket输入流
            socket.close(); //关闭Socket
            System.out.println("您已退出系统！");
        }catch(Exception e) {
            System.out.println("Error"+e); //出错，则打印出错信息
        }
    }
}

